home *** CD-ROM | disk | FTP | other *** search
- #include "3DDEF.H"
- #include "GLOBAL.H"
- #include "FORWARD.H"
- #include "XCODE.H"
- #include "doslib.h"
-
- /* 画面制御 */
-
- /* チェックして、必要ならば画面にエコーする */
- /* 行の文字列が変更を受けたのでアップデートするのだ */
- void
- disp_check_1line_echo(register UNIT *tp)
- {
- register short int i;
- register UNIT **s,*p;
-
- for(s=SCREEN,i=0;i<YWIDTH-1;s++,i++) {
- if ((p = *s) == tp) {
- disp_1line(i,tp);
- }
- }
- }
-
- /* チェックして、必要ならば画面にエコーする */
- /* 挿入である */
- void
- disp_check_1line_insert(UNIT *line,register UNIT *tp)
- {
- register short int i;
- register UNIT **s,*p;
-
- for(s=SCREEN,i=0;i<YWIDTH;s++,i++) {
- if (*s == tp) {
- /* *s = line;*/
- disp_1line(i,line);
-
- while(s[1] != NOT) { /* 下の行が、空行もしくは何かある */
- i++;
- if ((p = (*s++)->ATO) == NIL) break;
- /* 空行ならもう終わり */
- disp_1line(i,p);
- /* *s = p;*/
- }
- }
- }
- }
-
- static UBYTE disp_work[VERY_LONG_LINE];
-
- /* 1行だけ y の位置に表示する */
- /* y は絶対座標である */
- void
- disp_1line(int y, UNIT *unit_pointer)
- {
- int x;
-
- if (unit_pointer) {
- line_get_body(disp_work,unit_pointer);
- etc_bit_convert_and_disp(0,y,disp_work);
- } else {
- etc_bit_convert_and_disp(0,y,"");
- }
- SCREEN[y] = unit_pointer; /* スクリーン更新 */
- }
-
- /* 1行だけカレントウインドウの y(相対) の位置に表示する */
- void
- disp_1line_rel(int y, UNIT *unit_pointer)
- {
- disp_1line(CWY0+y,unit_pointer);
- }
-
- UBYTE BOTTOM_FORMAT0[] = "===== ThunderWord V1.24 \
- ========================================================================";
- UBYTE BOTTOM_FORMAT1[] = "----- ThunderWord V1.24 \
- ------------------------------------------------------------------------";
-
- /*
- ================================================================================================
- =***= ThunderWord V0.4 ==[全角:ひら:ROMA:無変]== 0123456789abcdefgh.zzz =========================
- ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
- 0 8 16 24 32 40 48 56 64 72 80 88
- =[半角:カタ:通常:変換]=
- */
-
- /* カレントテキストに changed mark を付ける */
- /* カレントテキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_changed_10()
- {
- disp_cursor_off();
- if (CURRENT_CHANGED) {
- disp_btm_changed_x(CURRENT_TEXT);
- } else {
- disp_btm_changed_erase_x(CURRENT_TEXT);
- }
- }
-
- /* カレントテキストに changed mark を付ける */
- /* カレントテキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_changed()
- {
- disp_cursor_off();
- if (!CURRENT_CHANGED) {
- disp_btm_changed_x(CURRENT_TEXT);
- CURRENT_CHANGED = 1;
- }
- }
-
- /* テキストに bak mode を表示する */
- /* テキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_bak_10_x(int tn)
- {
- disp_cursor_off();
- if (TDATA[tn].BAK_FLAG) {
- disp_btm_changed_x_sub(tn,3,'B');
- } else {
- disp_btm_changed_x_sub(tn,3,'\0');
- }
- }
-
- /* テキストに changed mark を付ける */
- /* テキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_changed_10_x(int tn)
- {
- disp_cursor_off();
- if (TDATA[tn].CHANGED_FLAG) {
- disp_btm_changed_x(tn);
- } else {
- disp_btm_changed_erase_x(tn);
- }
- }
-
- /* 指定されたテキストに changed mark を付ける */
- /* そのテキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_changed_x(int tn)
- {
- disp_btm_changed_x_sub(tn,1,'*');
- }
-
- void
- disp_btm_changed_x_sub(int tn,int x,UBYTE c)
- {
- register int i;
- UBYTE wlist[MAX_WINDOW]; /* フラグ用 */
-
- window_which_has_text_number(tn,wlist);
-
- disp_cursor_off();
- etc_color(MIZU_EMPH_REV);
- for(i = 0;i < MAX_WINDOW;i++) {
- if (wlist[i]) { /* そのテキストが割り当てられているウインドウである */
- window_abs_loc(x,WDATA[i].WY1+1);
- if (c) {
- B_PUTC(c);
- } else if (i == CWN) {
- B_PUTC('=');
- } else {
- B_PUTC('-');
- }
- }
- }
- etc_color(NORMAL);
- }
-
- /* カレントから changed mark を外す */
- /* カレントテキストを表示しているすべてのウインドウに対して行う */
- void
- disp_btm_changed_erase_x(int tn)
- {
- disp_btm_changed_x_sub(tn,1,'\0');
- }
-
- /* 指定されたウインドウの、BOTTOM を表示する */
-
- void
- disp_btm_line(int wn)
- {
- UBYTE work[MAXLINE];
- UBYTE work2[MAXLINE];
- UBYTE w[5];
- int i,x;
-
- /* 元をコピー */
- if (wn == CWN) {
- strcpy(work,BOTTOM_FORMAT0);
- } else {
- strcpy(work,BOTTOM_FORMAT1);
- }
-
- if (i = strlen(FILE_NAMES_ST[WDATA[wn].WTEXTS].CONTENT)) {
- /* if (i = strlen(FILE_NAMES[WDATA[wn].WTEXTS].CONTENT)) {*/
- int j;
- strncpy(&work[49],FILE_NAMES_ST[WDATA[wn].WTEXTS].CONTENT,i);
- work[48] = ' ';
- if (i+49 < XWIDTH) {
- work[49+i] = ' ';
- strcpy(&work2[1],FILE_NAMES[WDATA[wn].WTEXTS].CONTENT);
- /* etc_get_pathname(&work2[1],FILE_NAMES[WDATA[wn].WTEXTS].CONTENT);*/
- if (work2[1]) {
- *work2 = ' ';
- strcat(work2," ");
- } else {
- *work2 = EOS;
- }
- } else {
- *work2 = EOS;
- }
- j = strlen(work2);
- if (j > XWIDTH-(49+i+3)+1) { /* 長過ぎるのでカット */
- j = XWIDTH-(49+i+3)-1;
- work[XWIDTH-1] = '$';
- } else {
- strncpy(&work[49+i+3],work2,j);
- }
- work[XWIDTH] = EOS;
- } else {
- return;
- }
-
- if (WDATA[wn].WY1+2 == UNDER_Y) {
- strncpy(&work[25],"[ : : : ]",46-25);
- /* strncpy(&work[25],"[全角:カタ:かな:変換]",46-25);*/
- /* strncpy(&work[25],"[半角:----:----:無変]",46-25);*/
- for(i = 0,x = 26;x <= 41;i++,x += 5) {
- if (FP_MODE[i] == (UBYTE)"ZKRM"[i]) {
- strncpy(&work[x],&("全角かなROMA無変"[i*4]),4);
- } else {
- strncpy(&work[x],&("半角--------変換"[i*4]),4);
- }
- }
- }
- etc_color(MIZU_EMPH_REV);
- disp_btm_line0(wn,work);
- disp_btm_changed_10_x(WDATA[wn].WTEXTS);
- disp_btm_bak_10_x(WDATA[wn].WTEXTS);
- etc_color(NORMAL);
- }
-
- /* 指定されたウインドウの、BOTTOM の位置に文字列を表示する */
- void
- disp_btm_line0(int wn, STR s)
- {
- disp_cursor_off();
- window_abs_loc(0,WDATA[wn].WY1+1);
- B_PRINT(s);
- SCREEN[WDATA[wn].WY1+1] = NOT; /* -1 */
- fep_follow_led();
- }
-
- void
- disp_show_cursor()
- {
- B_BPOKE(0x991,0); /* OFF フラグをセット */
- B_WPOKE(0x9bc,1); /* ダウンカウンタを1に */
- }
-
- void
- disp_cursor_off()
- {
- B_CUROFF();
- }
-
- void
- disp_cursor_on()
- {
- B_CURON();
- }
-
- /* CL がウインドウの中心-1行に来るように書き直す */
- void
- disp_cl_center_1()
- {
- disp_cl_y((CWY1-CWY0)/2-1);
- }
-
- /* CL がウインドウの中心に来るように書き直す */
- void
- disp_cl_center()
- {
- disp_cl_y((CWY1-CWY0)/2);
- }
-
- /* CL がウインドウの y 行目に来るように書き直す */
- void
- disp_cl_y(int y)
- {
- int movel;
-
- disp_top_flush(line_trace(CL,-y,&movel));
- CY = -movel;
- }
-
- /* 指定された行を最上行として画面を書き直す */
- void
- disp_top_flush(UNIT *top)
- {
- disp_middle_flush(0,top);
- }
-
- /* 指定された行を i 行として以下の画面を書き直す */
- void
- disp_middle_flush(int t,UNIT *top)
- {
- int i;
-
- for(i = 0;i < t;i++);
- for(;i <= CWY1 - CWY0;i++) {
- disp_1line_rel(i,top);
- if (top) {
- if (top == TAIL) {
- top = NIL;
- } else {
- top = top->ATO;
- }
- }
- }
- }
-
- /* 前を後で置き換える */
- void
- disp_replace(UNIT *d,UNIT *s)
- {
- register int i;
- register UNIT **sc;
-
- for(sc=SCREEN,i=0;i<YWIDTH;sc++,i++) {
- if (*sc == d) {
- disp_1line(i,s);
- }
- }
- }
-
- /* SCREEN[] で、前を後で置き換える */
- void
- disp_replace_SCREEN(UNIT *d,UNIT *s)
- {
- register int i;
- register UNIT **sc;
-
- for(sc=SCREEN,i=0;i<YWIDTH;sc++,i++) {
- if (*sc == d) {
- *sc = s;
- }
- }
- }
-
- /* up0 を見付たら、次の行を up で書き換え、さらにボトムに当たるまで書き直す */
- void
- disp_replace_after(UNIT *up0, UNIT *up)
- {
- register int i;
- register UNIT **sc,*wp;
-
- for(sc=SCREEN,i=0;i<YWIDTH;) {
- if (sc[i] == up0) {
- i++;
- wp = up;
- while(sc[i] != NOT) {
- disp_1line(i++,wp);
- if ((wp == TAIL) && (sc[i] != NOT)){
- disp_1line(i,NIL);
- break;
- }
- wp = wp->ATO;
- }
- } else {
- i++;
- }
- }
- }
-
- /* SCREN に up0 を見付たら、次の行を up で書き換え、さらにボトムに当たるまで書き直す */
- void
- disp_replace_after_SCREEN(UNIT *up0, UNIT *up)
- {
- register int i;
- register UNIT **sc,*wp;
-
- for(sc=SCREEN,i=0;i<YWIDTH;) {
- if (sc[i] == up0) {
- i++;
- wp = up;
- while(sc[i] != NOT) {
- sc[i++] = wp;
- if ((wp == TAIL) && (sc[i] != NOT)){
- sc[i] = NIL;
- break;
- }
- wp = wp->ATO;
- }
- } else {
- i++;
- }
- }
- }
-
- /* 指定されたウィンドウを、top を最上行として書き直す */
- void
- disp_window_top_flush(int wn,UNIT *top)
- {
- int i;
-
- for(i = WDATA[wn].WY0;i <= WDATA[wn].WY1;i++) {
- disp_1line(i,top);
- if (top) {
- if (top == TAIL) {
- top = NIL;
- } else {
- top = top->ATO;
- }
- }
- }
- disp_btm_line(wn);
- }
-
- /* すべてのウインドウを描き直す。ただし、ボトムはいじらない */
- void
- disp_all_window_redraw()
- {
- register int i;
- register UNIT *p;
-
- for(i=0;i<YWIDTH-1;i++) {
- if ((p = SCREEN[i]) != NOT) {
- disp_1line(i,p);
- }
- }
- work_cursor_cpx();
- }
-
- /* 1行だけ y の位置に表示する */
- /* y は絶対座標である */
- void
- disp_1line_rel_trans0(int x,int y, STR string)
- {
- etc_bit_convert_and_disp(x,CWY0+y,string);
- }
-
- /* 指定された位置から文字列を表示する */
- /* y は絶対座標である */
- /* 新しい X 座標を返す */
- int
- disp_half_line(int x,int y,STR s)
- {
- return(etc_bit_convert_and_disp(x,y,s));
- }
-
- /* カレントウインドウの y(相対) の位置に半行表示する */
- /* 新しい X 座標を返す */
- int
- disp_half_line_rel(int x,int y, STR s)
- {
- return(disp_half_line(x,CWY0+y,s));
- }
-
- /* 指定された行を y 座標として、それ以降の画面を書き直す */
- /* ちゃんとエコーする */
- void
- disp_half_flush(UNIT *top,int y)
- {
- register int i;
- register int delta = CWY1-CWY0;
-
- for(i = y;i <= delta;i++) {
- disp_1line_rel(i,top);
- if (top) {
- if (top == TAIL) {
- top = NIL;
- } else {
- top = top->ATO;
- }
- }
- }
- }
-
- extern UBYTE koho_10[10+1][MAXLINE];
- extern UWORD koho_10x[10+1];
-
- /* 候補ブロック( <= 9)を表示する */
- int
- disp_koho_block(int kn)
- {
- register int i;
- int x;
-
- window_abs_loc(0,UNDER_Y+1);
- B_PRINT("\x1b[0K"); /* カーソルから右をクリア */
- x = 0;
- for(i=1;i<=9;i++) {
- if (*koho_10[i]) { /* 候補があるなら */
- koho_10x[i] = x;
- disp_koho(i,kn,&x,koho_10[i]);
- } else {
- break;
- }
- }
- }
-
- /* 最下行に候補を表示する */
- /* x を更新する */
- /* 表示しきれない時は非零を返す */
- int
- disp_koho(int n,int kn,int *x,STR koho)
- {
- UBYTE koho_d[MAXLINE];
-
- window_abs_loc(*x,UNDER_Y+1);
- B_PUTC(n+'0');
- B_PUTC('.');
- if (n == kn) {
- etc_color(10); /* 選択色 */
- }
- etc_string_esc_cnv(koho,koho_d);
- B_PRINT(koho_d);
- *x = (B_LOCATE(-1,0) >> 16) + 1;
- if (n = kn) {
- etc_color(NORMAL); /* 戻す */
- }
- return(*x > 80);
- }
-
- void
- disp_cr_mode()
- {
- if (CR_VIEW) {
- KAIGYOU_CODE = KAIGYOU0;
- KAIGYOU_HIGH = 0x81;
- KAIGYOU_LOW = 0xde;
- } else {
- KAIGYOU_CODE = L' ';
- KAIGYOU_HIGH = KAIGYOU_CODE >> 8;
- KAIGYOU_LOW = KAIGYOU_CODE & 0xff;
- }
- }
-
- /* 変えたら非零を返す */
- int
- disp_tab_change(int a)
- {
- if ((a <= 0) || (a > TAB_LENGTH_LIMIT) || (a > CURRENT_JIZUME)) {
- /* 何もしない */
- } else {
- UNIT *wp;
- int bp,y;
-
- etc_set_tab(a);
- line_seigyou();
- under_print((STR)"タブ変更:作業中・・・");
- mark_set_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマーク */
- wp = HEAD->ATO; /* 先頭行 */
- line_arrange_all(wp);
- wp = mark_get_mark(XCODE_SYSMARK - XCODE_MARK + CWN,&bp);
- mark_erase_mark(XCODE_SYSMARK - XCODE_MARK + CWN); /* システムマークを消す */
- CL = wp;
- line_cl_cl();
- disp_cl_y(CY);
- work_line_analyze();
- CPX = work_byte_to_CPX(bp);
- CX0 = CX = ANALYZE[CPX].XPOS;
- under_blanc();
- return(1);
- }
- return(0);
- }
-
- /* 1行スクロールアップする */
- /* 最後に転送したポインタを返す */
- /* はみ出したなら */
- UNIT *
- disp_scroll_up1()
- {
- register int lyw_total,yw;
- register int cwy0,cwy1;
- UNIT *last;
- register int i,j;
-
- lyw_total = LYW_TOTAL/4;
- cwy0 = CWY0;
- last = SCREEN[cwy1 = CWY1];
- if (yw = lyw_total*(cwy1-cwy0)) { /* スクロールするラスタユニット数 */
- TXRASCPY((cwy0+1)*lyw_total*256+cwy0*lyw_total,yw,0x0003);
- for(i=cwy0,j=cwy0+1;j<=cwy1;i++,j++) {
- SCREEN[i] = SCREEN[j];
- }
- SCREEN[cwy1] = NIL;
- }
- return(last);
- }
-
- /* 1行スクロールダウンする */
- /* 最後に転送したポインタを返す */
- UNIT *
- disp_scroll_dn1()
- {
- register int lyw_total,yw;
- register int cwy0,cwy1;
- UNIT *last;
- register int i,j;
-
- lyw_total = LYW_TOTAL/4;
- last = SCREEN[cwy0 = CWY0];
- cwy1 = CWY1;
- if (yw = lyw_total*(cwy1-cwy0)) { /* スクロールするラスタユニット数 */
- TXRASCPY((cwy1*lyw_total-1)*256+(cwy1+1)*lyw_total-1,yw,0x8003);
- for(i=cwy1,j=cwy1-1;j>=cwy0;i--,j--) {
- SCREEN[i] = SCREEN[j];
- }
- SCREEN[cwy0] = NIL;
- }
- return(last);
- }
-
- void
- disp_hmode()
- {
- register int i;
-
- for(i=0;i<MAX_WINDOW;i++) {
- if (WDATA[i].WY1+2 == UNDER_Y) {
- break;
- }
- }
- disp_btm_line(i);
- }
-
- /* 最下行に記号候補を表示する */
- /* 16個ずつかく */
- void
- disp_kigou_koho()
- {
- int xn;
- UBYTE w[MAXLINE];
- int kigou_block;
- register int i;
- UBYTE spacer[4];
-
- sprintf((char *)w,"[記号入力] <%4X>",kigou_begin);
- window_abs_loc(0,UNDER_Y+1);
- etc_color(MIZU_REV);
- B_PRINT(w);
- window_abs_loc(17,UNDER_Y+1);
- kigou_block = kigou_begin & 0xfff0;
- xn = kigou_begin & 0x000f;
- if (etc_char_disp_len(etc_normal_jis(kigou_begin)) == 1) {
- strcpy(spacer," ");
- } else {
- strcpy(spacer," ");
- }
- for(i = 0;i<16;i++) {
- etc_color(RAW0);
- B_PRINT(spacer);
- if (i == xn) {
- etc_color(MIZU_REV);
- }
- B_PUTC(etc_normal_jis(kigou_block+i));
- }
- etc_color(NORMAL);
- B_PRINT("\x1b[0K");
- }
-
- /* 指定位置から文字列 string を表示する */
- /* 左側には fl がある */
- /* 画面外に出そうになったら、スクロールアップし、その行数を返す */
- /* CWY1-CWY0 が最下行 */
- int
- disp_out_stop(STR fl,int *bx,int *by,STR string)
- {
- UBYTE l[VERY_LONG_LINE*4], s[VERY_LONG_LINE*4];
- register int fl_len;
- register int flag;
- register int ly = CWY1-CWY0;
- register int scroll_up_counter = 0;
-
- if (!*string) {
- return(0);
- }
- fl_len = strlen(fl); /* 左側の長さを調べる */
- cut_2line_link_check(fl,string,fl,s,CURRENT_JIZUME);
- /* 左側と string を接続してカットする */
-
- if (*s) { /* 1行ではおさまらなかった(string は2行以上にまたがる) */
- *bx = etc_bit_convert_and_disp(*bx,CWY0+*by,&fl[fl_len]);
- #if 0
- *bx = disp_half_line(x,CWY0+y,s);
- *bx = disp_half_line_rel(*bx,*by,&fl[fl_len]); /* まずは1行表示 */
- #endif
- while(*s) {
- if (++(*by) > ly) { /* ウインドウからはみ出る */
- register UNIT *uuu;
-
- scroll_up_counter++;
- if (CY) {
- uuu = disp_scroll_up1();
- SCREEN[CWY1] = uuu->ATO;
- (*by)--; /* 戻す */
- CY--;
- } else {
- return(scroll_up_counter);
- }
- }
- cut_line(s,l,s,CURRENT_JIZUME);
- /*etc_beep();*/
- *bx = etc_bit_convert_and_disp(0,CWY0+*by,l);
- /* *bx = disp_half_line_rel(0,*by,l);*/
- }
- strcpy(fl,l); /* 最後に表示した物を fl とする */
- if (etc_last(fl) == CR) { /* 最後に表示した行が改行で終わっている */
- (*by)++; /* 次に表示を開始するのは、もう一行先 */
- *bx = 0; /* の行頭から */
- *fl = EOS;
- }
- return(scroll_up_counter);
- } else { /* 1行でおさまった */
- *bx = disp_half_line_rel(*bx,*by,&fl[fl_len]);
- if (etc_last(string) == CR) {
- (*by)++;
- *bx = 0;
- *fl = EOS;
- }
- return(0);
- }
- }
-
- UWORD CRX,CRY;
- UWORD FCR;
-
- /* 指定された行のバイト位置を x,y として、それ以降の画面を書き直す */
- /* 見える範囲内だけ、超特急で書く */
- /* もちろんカレントウインドウだけ */
- /* 多少いい加減でも速度の方を優先 */
- /* TEXT に反映しない */
- /* あとでエコーするでしょ */
- /* TBUFF_R が最初にある */
- /* 改行で節約できたらする */
- void
- disp_trans_half_flush(UNIT *p0,int bp,int x,int y)/* ,,, */
- {
- UBYTE l[VERY_LONG_LINE*8], s[VERY_LONG_LINE*8];
- register UNIT *p;
- register int flag;
- register UWORD c;
- int y0;
-
- FCR = 1;
- p = p0;
- *l = EOS;
- CUT_GETA = x; /* フラッシュの開始点 */
- y0 = y;
-
- while(SCREEN[CWY0+y0] != p) {
- y0--;
- if ((y0 < 0) || (CWY0+y0 < 0)) {
- y0 = y;
- while(SCREEN[CWY0+y0] != p) {
- y0++;
- }
- break;
- }
- }
-
- for(;y0 <= y;y0++) {
- if (p == TAIL) {
- break;
- }
- line_cat_body(l,p);
- p = p->ATO;
- }
-
- if (p != TAIL) {
- line_cat_body(l,p);
- }
- /*under_print(l);binkey();*/
- /* p = p0;*/
-
- if (x >= CURRENT_JIZUME) {
- if (l[bp] != CR) {
- x = 0;
- if (++y > (CWY1-CWY0)) { /* いきなり画面外である */
- CUT_GETA = 0;
- return;
- }
- }
- }
-
- flag = cut_line(&l[bp],s,l,CURRENT_JIZUME-x); /* 最初の半行 */
- if (((c = etc_last(s)) == CR) || flag) { /* 余りがある=完全に一行が取れた */
- /* disp_1line_rel_trans0(x,y,s);*/
- /* CUT_GETA = 0;*/
- if (c == CR) { /* !!!改行を書こうとしている */
- if (CRX) { /* 既に書いた */
- if (CRY == y) { /* 前回と同じ行に改行を書く */
- disp_1line_rel_trans0(x,y,s);
- CUT_GETA = 0;
- return;
- } else { /* 最初の改行が移動した? */
- if (FCR) {
- if (!x && (y == CRY+1)) {
- /* x が非零ならば、未変換を左に持つ行かも知れない */
- disp_trans_scroll_dn1(y);
- disp_1line_rel_trans0(x,y,s);
- CRY = y;
- return;
- }
- CRY = y; /* 続行 */
- }
- }
- } else { /* まだ書いてない */
- CRX = 1;
- CRY = y;
- }
- FCR = 0;
- }
- disp_1line_rel_trans0(x,y,s);
- CUT_GETA = 0;
- #if 0
- if (!flag && (c == CR)) {
- window0();printf("[%d][%d]",y0,y);
- return;
- }
- #endif
- if (p != TAIL) {
- p = p->ATO;
- }
- #if 0
- if (p == TAIL) { /* 末行だ,,,, */
- line_append1(p = line_get_free());
- } else {
- p = p->ATO;
- }
- /* これ以降、p の先頭に l を挿入すれば良い */
- #endif
- } else {
- strcpy(l,s); /* 戻す */
- p = p->ATO;
- if ((p == TAIL) || (!p)) { /* もう後の行は無い */
- disp_1line_rel_trans0(x,y,l);
- CUT_GETA = 0;
- /* ウインドウ最下行までを消して終了 */
- for(y++;y <= (CWY1-CWY0);y++) {
- disp_half_line_rel(0,y,(STR) "");
- }
- return;
- }
- line_cat_body(l,p); /* 次の行を追加する */
- #if 0
- flag = cut_line(&l[bp],s,l,CURRENT_JIZUME-x); /* 最初の半行 */
- #else
- flag = cut_line(l,s,l,CURRENT_JIZUME-x); /* 最初の半行 */
- #endif /* flag = strlrn(l) */
- if (((c = etc_last(s)) == CR) || flag) {
- /* 余りがある=完全に一行が取れた */
- /* disp_1line_rel_trans0(x,y,s);*/
- /* CUT_GETA = 0;*/
- if (c == CR) { /* !!!改行を書こうとしている */
- if (CRX | CRY) { /* 既に書いた */
- if (CRY == y) { /* 前回と同じ行に改行を書く */
- disp_1line_rel_trans0(x,y,s);
- CUT_GETA = 0;
- return;
- } else {
- if (FCR) {
- if (y == CRY+1) {
- disp_trans_scroll_dn1(y);
- disp_1line_rel_trans0(x,y,s);
- CRY = y;
- return;
- }
- CRY = y; /* 続行 */
- }
- }
- } else { /* まだ書いてない */
- CRX = 1;
- CRY = y;
- }
- FCR = 0;
- }
- disp_1line_rel_trans0(x,y,s);
- CUT_GETA = 0;
- #if 0
- if (flag == i) {
- etc_beep();etc_beep();
- return;
- }
- #endif
- p = p->ATO;
- /* これ以降、p の先頭に l を挿入すれば良い */
- } else {
- /* 出入りが無かったのだから、これで終わり */
- disp_1line_rel_trans0(x,y,s);
- #if 1
- CUT_GETA = 0;
- return;
- #endif
- }
- }
- CUT_GETA = 0; /* ダメ押し */
- y++;
- disp_line_wave(p,y,l);
- }
-
- UBYTE ccc = 15;
-
- /* up の指す行(位置は y)の行頭に s を挿入し、次々に送って行く */
- /* エコーしない */
- /* テキストに反映しない */
- /* 改行で節約できたらする */
- void
- disp_line_wave(UNIT *up,int y,STR s)
- {
- UBYTE l[VERY_LONG_LINE*8],t[VERY_LONG_LINE*8];
- register UNIT *wp = up;
- register int i;
- register int ly;
-
- if (y > (ly = (CWY1-CWY0))) {
- return;
- }
-
- /*
- window0();
- printf("[%s][%s]",s,up->BODY);binkey();
- */
- /*etc_color(ccc);if (ccc == 15) ccc = 14; else ccc = 15;*/
- strcpy(l,s);
- if (wp != TAIL) {
- line_cat_body(l,wp);
- }
- while(y <= ly) {
- /* s1 -> s2(切り出し)+ s3(余り)s1 == s3 でもOK */
- if (cut_line(l,t,l,CURRENT_JIZUME)) { /* 余りの長さを返す */
- /* etc_bit_convert_and_disp(0,CWY0+y,t);*/
- if (etc_last(t) == CR) { /* !!!改行を書こうとしている */
- if (CRX | CRY) { /* 既に書いた */
- if (CRY == y) { /* 前回と同じ行に改行を書く */
- etc_bit_convert_and_disp(0,CWY0+y,t);
- return;
- } else {
- if (FCR) {
- if (y == CRY+1) {
- disp_trans_scroll_dn1(y);
- etc_bit_convert_and_disp(0,CWY0+y,t);
- CRY = y;
- return;
- }
- CRY = y; /* 続行 */
- }
- }
- } else { /* まだ書いてない */
- CRX = 1;
- CRY = y;
- }
- FCR = 0;
- }
- etc_bit_convert_and_disp(0,CWY0+y,t);
- if (wp != TAIL) {
- wp = wp->ATO;
- line_cat_body(l,wp);
- }
- } else { /* 余りが無い */
- /* etc_bit_convert_and_disp(0,CWY0+y,t);*/
- if (etc_last(t) == CR) { /* !!!改行を書こうとしている */
- if (CRX | CRY) { /* 既に書いた */
- if (CRY == y) { /* 前回と同じ行に改行を書く */
- etc_bit_convert_and_disp(0,CWY0+y,t);
- return;
- } else {
- if (FCR) {
- if (y == CRY+1) {
- disp_trans_scroll_dn1(y);
- etc_bit_convert_and_disp(0,CWY0+y,t);
- CRY = y;
- return;
- }
- CRY = y; /* 続行 */
- }
- }
- } else { /* まだ書いてない */
- CRX = 1;
- CRY = y;
- }
- FCR = 0;
- }
- etc_bit_convert_and_disp(0,CWY0+y,t);
- wp = wp->ATO;
- if ((!wp) || (wp == TAIL)) {
- /* ウインドウ最下行までを消して終了 */
- for(++y;y <= (CWY1-CWY0);y++) {
- etc_bit_convert_and_disp(0,CWY0+y,(STR)"");
- }
- break; /* 終了 */
- } else {
- line_cat_body(l,wp);
- }
- }
- y++;
- }
- /*error("5");*/
-
- }
-
- /* y 行から下を n 行スクロールダウンする */
- /* y は相対 */
- void
- disp_trans_scroll_dn1(int y)
- {
- register int lyw_total,yw;
- register int wy0,wy1;
-
- UBYTE w[MAXLINE];
-
- /*sprintf(w,"(%d)(%d)",y,n);under_print(w);binkey();*/
- lyw_total = LYW_TOTAL/4;
- wy0 = CWY0 + y;
- wy1 = CWY1;
- if (yw = lyw_total*(wy1-wy0)) { /* スクロールするラスタユニット数 */
- /* TXRASCPY(((wy1-n+1)*lyw_total-1)*256 + (wy1+1)*lyw_total-1,yw,0x8003);*/
- TXRASCPY((wy1*lyw_total-1)*256+(wy1+1)*lyw_total-1,yw,0x8003);
- }
- }
-
-
- void
- disp_trim_tail()
- {
- register int i;
-
- i = 0;
- while(1) {
- if (i == YWIDTH0) { /* 絶対的最後 */
- return;
- }
- if (SCREEN[i] == TAIL) {
- i++;
- while(SCREEN[i] == TAIL) {
- SCREEN[i++] = NULL;
- if (i == YWIDTH0) { /* 絶対的最後 */
- return;
- }
- }
- } else {
- i++;
- }
- }
- }
-